#include <unistd.h>
#include <iostream>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <cstring>
#include <semaphore.h>
/**
 * 信号量初始为1就是互斥信号量，初始为0就是同步信号量
 *
 *
 */
#define FIFO_PATH "./my_fifo"
#define MUTEX_SEM "./mutex_sem"
#define MSYNC_SEM_P "./sync_sem_p"
#define MSYNC_SEM_C "./sync_sem_c"

void writer()
{
    std::cout << "写端：创建/打开命名管道...\n";
    mkfifo(FIFO_PATH, 0666);
    int fd = open(FIFO_PATH, O_WRONLY);
    if (fd == -1)
    {
        perror("open fifo failed");
        return;
    }
    const char *message = "hello from writer";
    write(fd, message, strlen(message) + 1);
    std::cout << "写端：已写入数据\n";
    close(fd);
}

void reader()
{
    std::cout << "读端：打开命名管道...\n";
    int fd = open(FIFO_PATH, O_RDONLY);
    if (fd == -1)
    {
        perror("open file failed");
        return;
    }
    char buffer[256];
    read(fd, buffer, sizeof(buffer));
    std::cout << "读端读到：" << buffer << "\n";
    close(fd);
}

int main(int argc, char *argv[])
{
    if (argc < 2)
    {
        std::cout << "使用方法:\n";
        std::cout << "  ./named_pipe reader  (运行读端)\n";
        std::cout << "  ./named_pipe writer  (运行写端)\n";
        return 1;
    }
    if (strcmp(argv[1], "reader") == 0)
        reader();
    else if (strcmp(argv[1], "writer") == 0)
        writer();
    return 0;
}
// 讲一个东西先讲它的定义，然后讲作用，最后讲它起作用的原理
// 信号量是一个计数器，主要用于实现进程间的同步与互斥，不是用于缓存进程间通信的数据

// int main()
// {
//     // 0读1写
//     int fd[2];
//     pid_t pid;
//     char buffer[256];
//     const char *message = "Hello from parent!";
//     if (pipe(fd) == -1)
//     {
//         perror("pipe failed");
//         return 1;
//     }
//     pid = fork();
//     if (pid == -1)
//     {
//         perror("fork failed");
//         return 1;
//     }
//     if (pid == 0)
//     {
//         close(fd[1]);
//         read(fd[0], buffer, sizeof(buffer));
//         std::cout << "子进程读到：" << buffer << "\n";
//         close(fd[0]);
//     }
//     else
//     {
//         close(fd[0]);
//         write(fd[1], message, strlen(message) + 1);
//         std::cout << "父进程写入：" << message << "\n";
//         close(fd[1]);
//         wait(NULL);
//     }
//     return 0;
// }